//给你一个数组 nums 和一个值 val，你需要 原地 移除所有数值等于 val 的元素，并返回移除后数组的新长度。
//要知道数组的元素在内存地址中是连续的，不能单独删除数组中的某个元素，只能覆盖。


#include <iostream>
#include <vector>

using namespace std;

////暴力解法：双层循环
////时间复杂度：O(n^2),空间复杂度：O(1)
//int removeElement(vector<int>& nums, int val)
//{
//    int size = nums.size();
//    for (int i = 0; i < size; i++) 
//    {
//        if (nums[i] == val) 
//        { // 发现需要移除的元素，就将数组集体向前移动一位
//            for (int j = i + 1; j < size; j++) 
//            {
//                nums[j - 1] = nums[j];
//            }
//
//            i--; // 因为下标i以后的数值都向前移动了一位，所以i也向前移动一位
//                 //例如下标为2的数被下标为3的数覆盖，那就又要从下标2开始循环
//            size--; // 此时数组的大小-1
//        }
//    }
//    return size;
//}

//双指针法
//时间复杂度：O(n)，空间复杂度：O(1)
int removeElement(vector<int>& nums, int val)
{
    int slowIndex = 0;
    for (int fastIndex = 0; fastIndex < nums.size(); fastIndex++) 
    {
        if (val != nums[fastIndex]) 
        {
            nums[slowIndex++] = nums[fastIndex];//快指针是一直走的，不相等，将快指针的值赋给慢指针，赋完之后慢指针+1
        }
    }
    return slowIndex;
}
int main()
{
    int n;
    cin >> n;
    vector<int> vec;
    int temp;
    for(int i = 0; i < n; ++i)
    {
        cin >> temp;
        vec.push_back(temp);
    }

    int num;
    cin >> num;
    int ret = removeElement(vec,num);
    cout << ret << endl;
}
